home *** CD-ROM | disk | FTP | other *** search
/ Nautilus 1992 July / Nautilus-3-8 / Nautilus-3-8.bin / Tools & Utilities / Techy Stuff / Source ƒ / Filelist ƒ / Options.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-09-14  |  7.4 KB  |  321 lines

  1. /*
  2.     FileList 1.4
  3.     "Options.c"
  4. */
  5.  
  6. #include "Main.h"
  7. #include "Utilities.h"
  8. #include "Stack.h"
  9. #include "Search.h"
  10. #include "Options.h"
  11.  
  12. #define OptionDialog    131        /* Options */
  13. #define        OptionOk        1
  14. #define        OptionSave        2
  15. #define        OptionCancel    3
  16. #define        OptionAuto        4
  17. #define        OptionTabs        5
  18. #define        OptionDate1        6
  19. #define        OptionDate2        7
  20. #define        OptionDate3        8
  21. #define        OptionWindow    9
  22. #define        OptionIcon        11
  23. #define        OptionStuffit    12
  24. #define        OptionCompactor    13
  25.  
  26. #define MemoryDialog    133        /* Memory options */
  27. #define        MemorySave        1
  28. #define        MemoryCancel    2
  29. #define        MemoryHeapF        3
  30. #define        MemoryHeapT        4
  31. #define        MemoryVolumesF    5
  32. #define        MemoryVolumesT    6
  33. #define        MemoryFilesF    7
  34. #define        MemoryFilesT    8
  35. #define        MemoryNameF        9
  36. #define        MemoryNameT        10
  37. #define        MemoryIcon        12
  38. #define        MemoryFrame        13
  39.  
  40. /* ----- Save options file --------------------------------------------- */
  41.  
  42. static short SaveOptions (register ParameterPtr p)
  43. {    
  44.     register short err;
  45.     register StringHandle str;
  46.     short r;
  47.     long count;
  48.  
  49.     err = 9999;
  50.     if (!(str = GetString(OPTION_FILE)))
  51.         goto done;
  52.     HLock(str);
  53.     FSDelete(*str, SysVRefNum);
  54.     err = Create(*str, SysVRefNum, Creator, Options);
  55.     if (!err)
  56.         err = FSOpen(*str, SysVRefNum, &r);
  57.     HUnlock(str);
  58.     if (err)
  59.         goto done;
  60.     count = sizeof(Parameter);
  61.     err = FSWrite(r, &count, p);
  62.     FSClose(r);
  63.     FlushVol(0L, SysVRefNum);
  64. done:
  65.     return err;
  66. }
  67.  
  68. /* ----- Set global variables ------------------------------------------ */
  69.  
  70. static void SetGlobals (register ParameterPtr p)
  71. {
  72.     Heap = p->heap;
  73.     VolumeData.percent = p->volumes;
  74.     FileData.percent= p->files;
  75.     Record = p->name;
  76.     DFormat1(p->date);
  77.     Automatic = p->automatic;
  78.     Stuffit = p->stuffit;
  79.     Compactor = p->compactor;
  80.     Tabs = p->tabs;
  81.     VolumeData.rectangle = p->vwindow;
  82.     FileData.rectangle = p->fwindow;
  83.     if (Tabs) {
  84.         VolumeData.string = VolumeToString2;
  85.         FileData.string = FileToString2;
  86.     } else {
  87.         VolumeData.string = VolumeToString1;
  88.         FileData.string = FileToString1;
  89.     }
  90.     CheckItem(VolumeM, vAuto, Automatic);
  91. }
  92.  
  93. /* ----- Set up parameter record --------------------------------------- */
  94.  
  95. static void SetParameter (register ParameterPtr p)
  96. {
  97.     p->version = VERSION;
  98.     p->heap = Heap;
  99.     p->volumes = VolumeData.percent;
  100.     p->files = FileData.percent;
  101.     p->name = Record;
  102.     p->date = DFormat2();
  103.     p->automatic = Automatic;
  104.     p->stuffit = Stuffit;
  105.     p->compactor = Compactor;
  106.     p->tabs = Tabs;
  107.     p->vwindow = VolumeData.rectangle;
  108.     p->fwindow = FileData.rectangle;
  109. }
  110.  
  111. /* ----- Filter procedure for dialog ----------------------------------- */
  112.  
  113. static pascal Boolean filter (
  114.     register DialogPtr dialog,
  115.     register EventRecord *event,
  116.     register short *item)
  117. {
  118.     register unsigned char ch;
  119.  
  120.     switch (event->what) {
  121.         case keyDown:
  122.         case autoKey:
  123.             ch = event->message & charCodeMask;
  124.             if (ch == 0x0D || ch == 0x03) {
  125.                 *item = MemoryCancel;
  126.                 return TRUE;    /* Don't handle the event */
  127.             } else
  128.                 if (ch >= '0' && ch <= '9') {
  129.                     /* digit */
  130.                 } else
  131.                     if (ch != 0x08 && ch != '\t') {
  132.                         SysBeep(1);
  133.                         event->what = nullEvent;
  134.                     }
  135.             break;
  136.     }
  137.     return FALSE;    /* Go ahead and handle the event */
  138. }
  139.  
  140. /* ----- Convert local rectangle into global rectangle ----------------- */
  141.  
  142. static void Convert (
  143.     register WindowPtr w,
  144.     register Rect *r)
  145. {
  146.     GrafPtr port;
  147.  
  148.     GetPort(&port);
  149.     SetPort(w);
  150.     *r = w->portRect;
  151.     LocalToGlobal(&topLeft(*r));
  152.     LocalToGlobal(&botRight(*r));
  153.     SetPort(port);
  154. }
  155.  
  156. /* ----- Options dialog ------------------------------------------------ */
  157.  
  158. static void DoOptions1 (void)
  159. {
  160.     register DialogPtr dialog;
  161.     register short i, date;
  162.     short item;
  163.     Boolean cont;
  164.     Parameter parm;
  165.  
  166.     CenterDialog('DLOG', OptionDialog);
  167.     if (dialog = GetNewDialog(OptionDialog, 0L, -1L)) {
  168.         SetParameter(&parm);
  169.         ControlSet(dialog, OptionTabs, parm.tabs);
  170.         ControlSet(dialog, OptionAuto, parm.automatic);
  171.         ControlSet(dialog, OptionWindow, 0);
  172.         ControlSet(dialog, OptionStuffit, parm.stuffit);
  173.         ControlSet(dialog, OptionCompactor, parm.compactor);
  174.         date = parm.date + OptionDate1;
  175.         for (i = OptionDate1; i <= OptionDate3; i++)
  176.             ControlSet(dialog, i, i == date);
  177.         cont = TRUE;
  178.         SetUserItem(dialog, OptionIcon, (ProcPtr)DrawICN);
  179.         do {
  180.             ModalDialog(filter, &item);
  181.             switch(item) {
  182.                 case OptionOk:
  183.                 case OptionSave:
  184.                     parm.automatic = ControlCheck(dialog, OptionAuto);
  185.                     parm.tabs = ControlCheck(dialog, OptionTabs);
  186.                     parm.stuffit = ControlCheck(dialog, OptionStuffit);
  187.                     parm.compactor = ControlCheck(dialog, OptionCompactor);
  188.                     if (parm.date != (date -= OptionDate1))
  189.                         Update();
  190.                     parm.date = date;
  191.                     if (ControlCheck(dialog, OptionWindow)) {
  192.                         Convert((WindowPtr)&VolumeData, &parm.vwindow);
  193.                         Convert((WindowPtr)&FileData, &parm.fwindow);
  194.                     }
  195.                     if (item == OptionSave && (i = SaveOptions(&parm))) {
  196.                         Message(ERR_DISK, i);
  197.                         break;
  198.                     }
  199.                     SetGlobals(&parm);
  200.                 case OptionCancel:
  201.                     cont = FALSE;
  202.                     break;
  203.                 case OptionTabs:
  204.                 case OptionAuto:
  205.                 case OptionWindow:
  206.                 case OptionStuffit:
  207.                 case OptionCompactor:
  208.                     ControlToggle(dialog, item);
  209.                     break;
  210.                 case OptionDate1:
  211.                 case OptionDate2:
  212.                 case OptionDate3:
  213.                     date = item;
  214.                     for (i = OptionDate1; i <= OptionDate3; i++)
  215.                         ControlSet(dialog, i, i == date);
  216.                     break;
  217.             }
  218.         } while(cont);
  219.         DisposDialog(dialog);
  220.     }
  221. }
  222.  
  223. /* ----- Calculate percent value --------------------------------------- */
  224.  
  225. static long Percent (register long x)
  226. {
  227.     register long v;
  228.  
  229.     if (!InfoCount)
  230.         return 0L;
  231.     x *= 100;
  232.     v = x/InfoCount;
  233.     if (x % InfoCount > InfoCount/2)
  234.         v++;
  235.     return v;
  236. }
  237.  
  238. /* ----- Calculate average name length --------------------------------- */
  239.  
  240. static long Average (void)
  241. {
  242.     register long v;
  243.  
  244.     if (!InfoCount)
  245.         return 0L;
  246.     v = InfoSize/InfoCount;
  247.     if (InfoSize % InfoCount > InfoCount/2)
  248.         v++;
  249.     return v - sizeof(FileInfo) - 1;
  250. }
  251.  
  252. /* ----- Memory options dialog ----------------------------------------- */
  253.  
  254. static void DoOptions2 (void)
  255. {
  256.     register DialogPtr dialog;
  257.     register short i;
  258.     short item;
  259.     Boolean cont;
  260.     Parameter parm;
  261.  
  262.     CenterDialog('DLOG', MemoryDialog);
  263.     if (dialog = GetNewDialog(MemoryDialog, 0L, -1L)) {
  264.         SetParameter(&parm);
  265.         setNumber(dialog, MemoryHeapF, parm.heap);
  266.         setNumber(dialog, MemoryVolumesF, (long)parm.volumes);
  267.         setNumber(dialog, MemoryFilesF, (long)parm.files);
  268.         setNumber(dialog, MemoryNameF, (long)parm.name);
  269.         cont = TRUE;
  270.         SetUserItem(dialog, MemoryIcon, (ProcPtr)DrawICN);
  271.         SetUserItem(dialog, MemoryFrame, (ProcPtr)FrameItem);
  272.         do {
  273.             ModalDialog(filter, &item);
  274.             switch(item) {
  275.                 case MemoryHeapT:
  276.                     SysBeep(1);
  277.                     break;
  278.                 case MemoryVolumesT:
  279.                     setNumber(dialog, MemoryVolumesF,
  280.                         Percent((long)VolumeData.count));
  281.                     break;
  282.                 case MemoryFilesT:
  283.                     setNumber(dialog, MemoryFilesF,
  284.                         Percent((long)FileData.count));
  285.                     break;
  286.                 case MemoryNameT:
  287.                     setNumber(dialog, MemoryNameF, Average());
  288.                     break;
  289.                 case MemorySave:
  290.                     parm.heap = getNumber(dialog, MemoryHeapF,
  291.                         10240L, 16777216L);
  292.                     parm.volumes = getNumber(dialog, MemoryVolumesF,
  293.                         1L, 32767L);
  294.                     parm.files = getNumber(dialog, MemoryFilesF,
  295.                         1L, 32767L);
  296.                     parm.name = getNumber(dialog, MemoryNameF,
  297.                         1L, 31L);
  298.                     if (i = SaveOptions(&parm)) {
  299.                         Message(ERR_DISK, i);
  300.                         break;
  301.                     }
  302.                     SetGlobals(&parm);
  303.                 case MemoryCancel:
  304.                     cont = FALSE;
  305.                     break;
  306.             }
  307.         } while(cont);
  308.         DisposDialog(dialog);
  309.     }
  310. }
  311.  
  312. /* ----- Options dialog ------------------------------------------------ */
  313.  
  314. void DoOptions (short option)
  315. {
  316.     if (option & optionKey)
  317.         DoOptions2();
  318.     else
  319.         DoOptions1();
  320. }
  321.